package com.pethospital.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.pethospital.dto.AppointmentDTO;
import com.pethospital.entity.Appointment;

import java.util.List;
import java.util.Map;

/**
 * 预约服务接口
 */
public interface AppointmentService extends IService<Appointment> {

    /**
     * 创建预约
     *
     * @param appointmentDTO 预约DTO
     * @param userId 用户ID
     * @return 预约ID
     */
    Long createAppointment(AppointmentDTO appointmentDTO, Long userId);

    /**
     * 取消预约
     *
     * @param id 预约ID
     * @param userId 用户ID
     */
    void cancelAppointment(Long id, Long userId);

    /**
     * 完成预约
     *
     * @param id 预约ID
     * @param staffId 医护人员ID
     */
    void completeAppointment(Long id, Long staffId);

    /**
     * 确认预约
     *
     * @param id 预约ID
     * @param staffId 医护人员ID
     */
    void confirmAppointment(Long id, Long staffId);

    /**
     * 拒绝预约
     *
     * @param id 预约ID
     * @param staffId 医护人员ID
     */
    void rejectAppointment(Long id, Long staffId);

    /**
     * 获取预约详情
     *
     * @param id 预约ID
     * @param userId 当前用户ID
     * @return 预约信息
     */
    Appointment getAppointment(Long id, Long userId);

    /**
     * 获取用户预约列表
     *
     * @param userId 用户ID
     * @param status 预约状态，null表示查询全部
     * @param page 页码
     * @param size 每页大小
     * @return 预约分页
     */
    Page<Appointment> getUserAppointments(Long userId, Integer status, int page, int size);

    /**
     * 获取医护人员预约列表
     *
     * @param staffId 医护人员ID
     * @param status 预约状态，null表示查询全部
     * @param page 页码
     * @param size 每页大小
     * @return 预约分页
     */
    Page<Appointment> getStaffAppointments(Long staffId, Integer status, int page, int size);

    /**
     * 获取医护人员今日预约
     *
     * @param staffId 医护人员ID
     * @return 今日预约列表
     */
    List<Appointment> getStaffTodayAppointments(Long staffId);

    /**
     * 获取医护人员预约统计
     *
     * @param staffId 医护人员ID
     * @return 预约统计信息
     */
    Map<String, Object> getStaffAppointmentStatistics(Long staffId);

    /**
     * 获取预约详情（包含关联信息）
     *
     * @param id 预约ID
     * @return 预约详情VO
     */
    com.pethospital.vo.AppointmentVO getAppointmentDetail(Long id);
} 